package com.gather.spring.retry.cglib.proxy;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**jdk动态代理方式
 * @author kxd
 * @date 2018/12/5 14:02
 * description:动态代理实现InvocationHandler调用处理器
 */
public class DynamicProxy implements InvocationHandler {
    private final Object subject;

    public DynamicProxy(Object subject) {
        this.subject = subject;
    }

    /**
     * 实现invoke方法
     * @param proxy
     * @param method
     * @param args
     * @return
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)  {
        int times = 0;
        while (times < RetryConstant.MAX_TIMES) {
            try {
                //反射调用invoke方法 ，subject方法所在类，方法参数
                return method.invoke(subject, args);
            } catch (Exception e) {
                times++;
                if (times >= RetryConstant.MAX_TIMES) {
                    throw new RuntimeException(e);
                }
            }
        }
        return null;
    }

    /**
     * 包装成静态方法
     * @param realSubject
     * @return
     */
    public static Object getProxy(Object realSubject) {
        InvocationHandler handler = new DynamicProxy(realSubject);
        //代理类 newProxyInstance创建实例，类加载器，实际方法接口，调用处理器
        return Proxy.newProxyInstance(handler.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), handler);
    }
}
